package client

import (
	"fmt"
	"net"
	"time"
)

const (
	broadcastPort = 8888              // 广播监听端口
	serverPort    = 8889              // 服务器端口
	broadcastIP   = "255.255.255.255" // 广播地址
)

func StartClient() {
	fmt.Println("=== UDP广播客户端 ===")
	fmt.Println("正在搜索服务器...")

	// 启动广播发送协程
	go broadcastServerInfo()

	// 启动服务监听协程
	startServer()
}

// 广播服务器信息
func broadcastServerInfo() {
	// 创建UDP广播地址
	broadcastAddr, err := net.ResolveUDPAddr("udp4", fmt.Sprintf("%s:%d", broadcastIP, broadcastPort))
	if err != nil {
		fmt.Printf("解析广播地址失败: %v\n", err)
		return
	}

	// 创建UDP连接
	conn, err := net.DialUDP("udp4", nil, broadcastAddr)
	if err != nil {
		fmt.Printf("创建UDP连接失败: %v\n", err)
		return
	}
	defer conn.Close()

	// 设置广播权限
	conn.SetWriteBuffer(1024)

	fmt.Printf("开始广播服务器信息...\n")

	// 定期发送广播消息
	ticker := time.NewTicker(5 * time.Second) // 每3秒广播一次
	defer ticker.Stop()

	for range ticker.C {
		message := fmt.Sprintf("SERVER_INFO|欢迎连接到服务器")
		_, err := conn.Write([]byte(message))
		if err != nil {
			fmt.Printf("发送广播失败: %v\n", err)
			continue
		}
		fmt.Printf("已发送广播: %s\n", message)
	}
}

// 启动客户端监听
func startServer() {
	// 创建TCP监听地址
	serverAddr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf(":%d", serverPort))
	if err != nil {
		fmt.Printf("解析客户端地址失败: %v\n", err)
		return
	}

	// 创建TCP监听
	tcpListener, err := net.ListenTCP("tcp", serverAddr)
	if err != nil {
		fmt.Printf("启动客户端监听失败: %v\n", err)
		return
	}

	defer tcpListener.Close()

	conn, err := tcpListener.AcceptTCP()
	if err != nil {
		fmt.Printf("接受服务端连接失败: %v\n", err)
		return
	}
	defer conn.Close()
	fmt.Printf("客户端开始监听端口: %d\n", serverPort)

	buffer := make([]byte, 1024)

	for {
		// 接收客户端消息
		n, err := conn.Read(buffer)
		if err != nil {
			fmt.Printf("接收数据失败: %v\n", err)
			continue
		}
		message := string(buffer[:n])
		fmt.Printf("收到消息: %s\n", message)

		// 发送回复
		reply := fmt.Sprintf("你好服务端! 已收到你的消息: %s", message)
		_, err = conn.Write([]byte(reply))
		if err == nil {
			fmt.Printf("已回复服务端: %s\n", reply)
		}
	}
}
